#ifndef _UTILS_LIST_H_
#define _UTILS_LIST_H_
#ifdef __cplusplus
extern "C"
{
#endif
#include <stdbool.h>
    typedef struct utils_node
    {
        struct utils_node *prev;
        struct utils_node *next;
        void *data;
    } utils_node_t;
    typedef void utils_list_t;
    typedef bool (*utils_list_search_cb_t)(const utils_node_t *node);

    utils_list_t *utils_list_init();
    void utils_list_destory(utils_list_t *list, bool free_data);
    bool utils_list_append_tail(utils_list_t *list, void *data);
    bool utils_list_append_head(utils_list_t *list, void *data);
    void utils_list_remove_node(utils_list_t *list, const utils_node_t *node);
    void *utils_list_pop_tail(utils_list_t *list);
    void *utils_list_pop_head(utils_list_t *list);
    const utils_node_t *utils_list_search(utils_list_t *list, utils_list_search_cb_t condition_func);
#ifdef __cplusplus
}
#endif
#endif //_UTILS_LIST_H_